package com.fattyCorps.battle.service.battle.behavior;

import cn.hutool.extra.spring.SpringUtil;
import com.fattyCorps.battle.service.battle.Battle;
import com.fattyCorps.battle.service.battle.behavior.state.SBhvFiler;
import com.fattyCorps.battle.service.battle.behavior.state.SEffectFilter;
import com.fattyCorps.battle.service.battle.behavior.state.SInvokeEffect;
import com.fattyCorps.battle.service.battle.behavior.state.SSelectTgt;
import com.fattyCorps.battle.service.battle.data.BattleHero;
import com.fattyCorps.battle.service.battle.effect.Effect;
import com.fattyCorps.common.enums.battle.EBehaviorEffectType;
import com.fattyCorps.common.mgr.Cfg;
import com.fattyCorps.common.obj.config.BehaviorEffectMould;
import com.fattyCorps.common.obj.config.SkillBehaviorMould;
import com.fattyCorps.common.util.GameCfgUtils;
import com.fattyCorps.common.util.fsm.FsmMch;
import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;

import java.util.ArrayList;
import java.util.List;

// 行为
// todo: 行为不应该初始化就创建，因为行为中的部分内容（创建者、触发者）是动态的，或者说在触发时，赋值
@Slf4j
public class Behavior {
    FsmMch fsmMch = new FsmMch();
    Battle battle;
    @Getter
    SkillBehaviorMould mould;
    @Setter
    BattleHero creator = null; // 创建这个行为的英雄
    @Setter
    BattleHero trigger = null; // 触发这个行为的英雄
    @Getter
    BattleHero owner = null;   // 拥有这个行为的英雄
    @Getter
    List<Effect> effects = new ArrayList<>();
    List<Effect> activeEffects = new ArrayList<>();
    @Getter
    boolean isBuff;
    Cfg cfg;

    public Behavior(Battle battle, SkillBehaviorMould mould, BattleHero owner, boolean isBuff) {
        this.battle = battle;
        this.mould = mould;
        cfg = SpringUtil.getBean(Cfg.class);
        this.owner = owner;
        // 默认是自己给自己加的行为，如：技能上的行为，但buff上的行为可不是自己加的了，需要手动设置行为的创建者为buff的施法者
        this.creator = owner;
        this.isBuff = isBuff;
    }

    public void init() {
        fsmMch.addState(new SBhvFiler());
        fsmMch.addState(new SSelectTgt());
        fsmMch.addState(new SEffectFilter());
        fsmMch.addState(new SInvokeEffect());

        fsmMch.addBlackboard(BhvBlackboard.BHV, this);
        fsmMch.addBlackboard(BhvBlackboard.BHV_OWNER, owner);
        fsmMch.addBlackboard(BhvBlackboard.BHV_CREATOR, creator);
        fsmMch.addBlackboard(BhvBlackboard.BHV_TRIGGER, trigger);
        fsmMch.addBlackboard(BhvBlackboard.BATTLE, battle);
        fsmMch.addBlackboard(BhvBlackboard.BHV_CFG, mould);
        fsmMch.addBlackboard(BhvBlackboard.BHV_ACTIVE_EFFECTS, activeEffects);

        // 行为下的效果
        if (mould == null) {
            throw new RuntimeException("行为的模板不能为空啊");
        }

        List<Integer> ids = GameCfgUtils.splitIdListStr(mould.getEffectIds());

//        BehaviorTrgCndMould trgCndMould = skillConfig.getBehaviorTriggerConditionMould(mould.getTriggerConditionId());

        for (Integer id : ids) {
            BehaviorEffectMould effectMould = cfg.getCfg(BehaviorEffectMould.class, id);
            if (effectMould.getType().equals(EBehaviorEffectType.StaticPropPermanent)) {
                // 永久增加属性的行为不参与临时战斗计算，直接在属性计算中处理
                continue;
            }

            /**
             * 施法人有如下几种情况
             * 1、无触发者：时机到了就触发，如回合开始前/后
             * 2、有触发者：被攻击，有英雄死亡
             *
             * 由于行为是由技能或buff生成，
             * 由技能生成的话，在生成的时候是没有触发人的，只有在触发技能行为时，才可能会有触发人
             * 而由buff生成的行为，其生成人可能并不是触发人，所以行为需要有生成人，触发人，所属人
             */
            Effect e = new Effect(this.battle, effectMould, owner, isBuff);
            effects.add(e);
        }
    }

    // 执行行为
    public void onEvent(BhvProcessor.Event e) {
        trigger = e.getTrigger();
        fsmMch.addBlackboard(BhvBlackboard.BHV_TRIGGER, trigger);

        fsmMch.addBlackboard(BhvBlackboard.EVENT, e);
        fsmMch.setState(SBhvFiler.class);
        activeEffects.clear();
        trigger = null;
    }
}
